package com.example.music.service.impl;


import com.example.music.service.UploadService;
import com.example.music.utils.ConstantPropertiesUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;


/**
 * @author: wangxiang
 * @date: 2022-08-17  17:06
 * @version: 1.0
 **/
@Service
public class UploadServiceImpl implements UploadService {

    @Override
    public String uploadSong(MultipartFile song) {
        // 访问图片时的基础url
        String baseUrl = ConstantPropertiesUtils.BASE_URL + "/song";
        try {
            //1、给上传的图片生成新的文件名
            //1.1获取原始文件名
            String imageName = song.getOriginalFilename();
            //2、把图片上传到图片服务器
            //2.1获取上传的io流
            InputStream input = song.getInputStream();
            //2.2调用FtpUtil工具类进行上传
            boolean result = this.uploadFile(imageName, input);
            if (result) {
                //返回地址
                return baseUrl  + "/" + imageName;
            } else {
                return "false";
            }
        } catch (IOException e) {
            return "false";
        }
    }

    /**
     * 上传图片
     *
     * @param uploadImage
     * @return
     */
    @Override
    public String uploadImage(MultipartFile uploadImage,String path) {

        // 访问图片时的基础url
        //String baseUrl = ConstantPropertiesUtils.BASE_URL + "/images";
        String baseUrl = ConstantPropertiesUtils.BASE_URL + path;
        try {
            //1、给上传的图片生成新的文件名
            //1.1获取原始文件名
            String imageName = uploadImage.getOriginalFilename();
            //1.2使用UUID生成新的文件名，新文件名 = uuid + 文件后缀
            String uuid = UUID.randomUUID().toString().replace("-", "");
            imageName = uuid + imageName;
            //1.3生成ftp默认文件所在的服务器端存储的子目录
            String filePath = new DateTime().toString("/yyyy/MM/dd");
            //2、把图片上传到图片服务器
            //2.1获取上传的io流
            InputStream input = uploadImage.getInputStream();
            //2.2调用FtpUtil工具类进行上传
            boolean result = this.uploadFile(imageName,path + filePath, input);
            if (result) {
                //返回地址
                //return baseUrl + filePath + "/" + imageName;
                return path + filePath + "/" +imageName;
            } else {
                return "false";
            }
        } catch (IOException e) {
            return "false";
        }
    }




    /**
     * 上传图片Service
     *
     * @param filename 图片名称
     * @param filePath file地址
     * @param input    流
     * @return
     */
    private Boolean uploadFile(String filename, String filePath, InputStream input) {
        //本地字符编码
        String localCharset = ConstantPropertiesUtils.LOCAL_CHARSET;
        // FTP协议里面，规定文件名编码为iso-8859-1
        String serverCharset = ConstantPropertiesUtils.SERVER_CHARSET;
        // ip地址
        String host = ConstantPropertiesUtils.HOST;
        // 端口
        int port = ConstantPropertiesUtils.PORT;
        // ftp用户名
        String username = ConstantPropertiesUtils.USERNAME;
        // ftp用户密码
        String password = ConstantPropertiesUtils.PASSWORD;
        //文件在服务器端保存的主目录
        String basePath = ConstantPropertiesUtils.BASE_PATH;
        boolean result = false;
        FTPClient ftp = new FTPClient();
        try {
            int reply;
            // 连接FTP服务器
            ftp.connect(host, port);
            // 如果采用默认端口，可以使用ftp.connect(host)的方式直接连接FTP服务器  登录
            ftp.login(username, password);
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return result;
            }
            //切换到上传目录
            if (!ftp.changeWorkingDirectory(basePath + filePath)) {
                //如果目录不存在创建目录
                String[] dirs = filePath.split("/");
                String tempPath = basePath;
                for (String dir : dirs) {
                    if (null == dir || "".equals(dir)) {
                        continue;
                    }
                    tempPath += "/" + dir;
                    if (!ftp.changeWorkingDirectory(tempPath)) {
                        if (!ftp.makeDirectory(tempPath)) {
                            return result;
                        } else {
                            ftp.changeWorkingDirectory(tempPath);
                        }
                    }
                }
            }
            //设置为被动模式
            ftp.enterLocalPassiveMode();
            //设置上传文件的类型为二进制类型
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            //设置上传文件名称编码
            if (FTPReply.isPositiveCompletion(ftp.sendCommand("OPTS UTF8", "ON"))) {
                localCharset = "UTF-8";
            }
            ftp.setControlEncoding(localCharset);

            //上传文件
            if (!ftp.storeFile(new String(filename.getBytes(localCharset), serverCharset), input)) {
                return result;
            }
            input.close();
            ftp.logout();
            result = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
            }
        }
        return result;
    }

    /**
     * 上传 歌曲 Service
     *
     * @param filename 图片名称
     * @param input    流
     * @return
     */
    private Boolean uploadFile(String filename, InputStream input) {
        //本地字符编码
        String localCharset = ConstantPropertiesUtils.LOCAL_CHARSET;
        // FTP协议里面，规定文件名编码为iso-8859-1
        String serverCharset = ConstantPropertiesUtils.SERVER_CHARSET;
        // ip地址
        String host = ConstantPropertiesUtils.HOST;
        // 端口
        int port = ConstantPropertiesUtils.PORT;
        // ftp用户名
        String username = ConstantPropertiesUtils.USERNAME;
        // ftp用户密码
        String password = ConstantPropertiesUtils.PASSWORD;
        //文件在服务器端保存的主目录
        String basePath = ConstantPropertiesUtils.BASE_PATH+"/song";
        boolean result = false;
        FTPClient ftp = new FTPClient();
        try {
            int reply;
            // 连接FTP服务器
            ftp.connect(host, port);
            // 如果采用默认端口，可以使用ftp.connect(host)的方式直接连接FTP服务器  登录
            ftp.login(username, password);
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return result;
            }
            //切换到上传目录
            ftp.changeWorkingDirectory(basePath);
            //设置为被动模式
            ftp.enterLocalPassiveMode();
            //设置上传文件的类型为二进制类型
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            //设置上传文件名称编码
            if (FTPReply.isPositiveCompletion(ftp.sendCommand("OPTS UTF8", "ON"))) {
                localCharset = "UTF-8";
            }
            ftp.setControlEncoding(localCharset);

            //上传文件
            if (!ftp.storeFile(new String(filename.getBytes(localCharset), serverCharset), input)) {
                return result;
            }
            input.close();
            ftp.logout();
            result = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
            }
        }
        return result;
    }
}
